﻿using System;
using System.Linq;
using System.Windows.Forms;
using App.Modelo;
using App.Modelo.Attributes;
using App.SolInf.Controlador;
using App.SolInf.Modelo;
using App.SolInf.Vista.Listado;

namespace App.SolInf.Vista
{
    [Formulario("Presupuestos")]
    public partial class DetallePresupuesto : Form
    {
        private Presupuesto _presupuesto;
        private ControladoraPresupuestos _controladoraPresupuestos;

        private ModoFormularioABM _modo = ModoFormularioABM.Modificacion;

        public ModoFormularioABM Modo
        {
            get { return _modo; }
            set
            {
                _modo = value;
                grpId.Visible = grpDerecho.Visible = toolStrip1.Visible = true;
                buscarCliente1.ReadOnly = false;
                cmbFormaPago.Enabled = textBox2.Enabled = true;
                switch (_modo)
                {
                    case ModoFormularioABM.Ver:
                        grpDerecho.Visible = toolStrip1.Visible = false;
                        buscarCliente1.ReadOnly = true;
                        cmbFormaPago.Enabled = textBox2.Enabled = false;
                        break;
                    case ModoFormularioABM.Alta:
                     //   grpId.Visible = false;
                        break;
                    case ModoFormularioABM.Baja:
                        break;
                    case ModoFormularioABM.Modificacion:
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }

        public ControladoraPresupuestos ControladoraPresupuestos
        {
            get {
                return _controladoraPresupuestos ??
                       (_controladoraPresupuestos =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraPresupuestos>());
            }
            set { _controladoraPresupuestos = value; }
        }

        public Presupuesto Presupuesto
        {
            get { return _presupuesto; }
            set
            {
                presupuestoBindingSource.DataSource = _presupuesto = value;

                if (value != null)
                {
                    lineaPresupuestoBindingSource.DataSource = value.LineasPresupuesto;
                }
            }
        }

        public DetallePresupuesto()
        {
            InitializeComponent();
        }

        private void CrearPresupuesto_Load(object sender, EventArgs e)
        {
            toolTip1.SetToolTip(btnBuscarCliente, "Buscar cliente");
            toolTip1.SetToolTip(btnCrearLinea, "Agregar una linea");
            toolTip1.SetToolTip(btbModiLinea, "Modificar lineas seleccionadas");
            toolTip1.SetToolTip(btnBajaLinea, "Eliminar lineas seleccionadas");

            buscarCliente1.Empresas = ControladoraPresupuestos.Repositorio.GetAll<Cliente>().Cast<Empresa>();

            cmbFormaPago.DataSource = Enum.GetValues(typeof (FormaPago));
            cmbFormaPago.SelectedItem = Presupuesto.FormaPago;

        }


        [Comando("alta")]
        public void Alta()
        {
            Text = "Nuevo Presupuesto";
            Modo = ModoFormularioABM.Alta;
            Presupuesto = new Presupuesto
                              {
                                  Vendedor = ModuloSolInf.Instance.UsuarioActual,
                                  FechaAlta = DateTime.Now,
                                  Id = ControladoraPresupuestos.GetNroPesupuesto()
                              };

            ModuloSolInf.Instance.AbrirFormulario(this);
        }


        private void btnCrearLinea_Click(object sender, EventArgs e)
        {
            var crearLineaPresupuesto = new CrearLineaVenta();
            crearLineaPresupuesto.Closed += new EventHandler(crearLineaPresupuesto_Closed);
            crearLineaPresupuesto.Alta( new LineaPresupuesto());
        }

        void crearLineaPresupuesto_Closed(object sender, EventArgs e)
        {
            var form = (CrearLineaVenta) sender;
            if(form.DialogResult == DialogResult.OK)
            {
                //Presupuesto.LineasPresupuesto.Add(form.LineaVenta);
                lineaPresupuestoBindingSource.Add(form.LineaVenta);
                _presupuesto.ActualizarSubtotal();
            }
        }
        
       
        

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                switch (Modo)
                {
                    case ModoFormularioABM.Alta:
                        ControladoraPresupuestos.Alta(Presupuesto);
                        MessageBox.Show("Se dio de alta el presupuesto. El vencimiento es "
                                        + Presupuesto.FechaVencimiento.ToString(), Text);
                        Close();
                        break;
                    case ModoFormularioABM.Modificacion:
                        ControladoraPresupuestos.Modificar(Presupuesto);
                        MessageBox.Show("Se modifico el presupuesto. El nuevo vencimiento es "
                                        + Presupuesto.FechaVencimiento.ToString(), Text);
                        Close();
                        break;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, 
                    Text, 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Exclamation);
            }
        }

        public void Modificar()
        {
            Text = "Modificar Presupuesto";

            if( Presupuesto.Estado == EstadoPresupuesto.Aprobado )
            {
                Modo = ModoFormularioABM.Ver;
                MessageBox.Show("El presupuesto no puede ser modificado porque ya fue aprobado");
            }
            else
            {
                Modo = ModoFormularioABM.Modificacion;    
            }
            
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        public void Ver()
        {
            Text = "Detalle de Presupuesto";
            Modo = ModoFormularioABM.Ver;
            ModuloSolInf.Instance.AbrirFormulario(this);
        }


        private void btbModiLinea_Click(object sender, EventArgs e)
        {
            if (dataGridView2.SelectedRows.Count >= 1)
            {
                foreach (DataGridViewRow row in dataGridView2.SelectedRows)
                {
                    var itemSeleccionado = (LineaPresupuesto) row.DataBoundItem;
                    var modiLineaPresupuesto = new CrearLineaVenta();
                    modiLineaPresupuesto.Closed += new EventHandler(modiLineaPresupuesto_Closed);

                    modiLineaPresupuesto.Alta(itemSeleccionado);
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un item");
            }
        }

        void modiLineaPresupuesto_Closed(object sender, EventArgs e)
        {
            _presupuesto.ActualizarSubtotal();
        }

        private void btnBajaLinea_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Seguro que desea eliminar?", Text, MessageBoxButtons.YesNo) == DialogResult.No)
                return;

            if (dataGridView2.SelectedRows.Count < 1)
                MessageBox.Show("Debe seleccionar un item");

            foreach (DataGridViewRow row in dataGridView2.SelectedRows)
                lineaPresupuestoBindingSource.Remove(row.DataBoundItem);

            _presupuesto.ActualizarSubtotal();

        }

        private void btnBuscarCli_Click(object sender, EventArgs e)
        {
            var listadoCliente = new ListadoCliente()
            {
                BotonCancelar = true,
                BotonSeleccionar = true
            };

            /** 
             * cuando se cierra el formulario listado de cliente obtengo el cliente que selecciono
             */
            listadoCliente.ItemSelected += listadoCliente_ItemSelected;
            listadoCliente.BuscarElemento();
        }
        
        void listadoCliente_ItemSelected(object sender, Git.Vista.Widgets.ListadoBusquedaItemEventArgs e)
        {
            Presupuesto.Cliente = (Cliente)e.ItemSeleccionado;
        }

        public void AprobarPresupuesto()
        {
            if (Presupuesto.Estado == EstadoPresupuesto.Aprobado)
            {
                MessageBox.Show("El presupuesto no puede ser modificado porque ya fue aprobado");
                Modo = ModoFormularioABM.Ver;
            }
            else
            {
                btnAprobarPresupuesto.Visible = true;
                Text = "Ventas";
                Modo = ModoFormularioABM.Modificacion;
            }
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        private void btnAprobarPresupuesto_Click(object sender, EventArgs e)
        {
            if (null == Presupuesto)
            {
                MessageBox.Show("Debe seleccionar un presupuesto");
                return;
            }

            if (MessageBox.Show(
                "Confirma la aprobacion del presupuesto?",
                Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
                return;

            try
            {
                

                ControladoraPresupuestos.AprobarPresupuesto(Presupuesto);
                DialogResult = DialogResult.OK;
                Close();
            }
            catch (PresupuestoVencidoException ex)
            {
                MessageBox.Show(
                    "El presupuesto esta vencido\nEl presupuesto vencio el " + Presupuesto.FechaVencimiento,
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);
            }
            catch (StockInsuficienteException ex)
            {
                MessageBox.Show(
                    "No hay stock disponible" + String.Join(", ", 
                        ex.Productos.Select(p => p.ToString()).ToArray<String>()),
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    ex.Message,
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);
            }
        }

    }
}
